package skladowisko;

import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Krzysiek
 */
public class Skladowisko
{

    private String id = "nieznane";
    protected List<Pole> pola = null;
    private int rzedy = 0;
    private int kolumny = 0;

    //**************************************************************************
    public Skladowisko()
    {
        pola = new LinkedList<Pole>();
    }
    //**************************************************************************

    public List<Pole> getPola()
    {
        return pola;
    }
    //**************************************************************************

    public boolean addPole(int x, int y, int w)
    {
        Pole nowe = new Pole(x, y, w, this.id + "." + x + "." + y);
        pola.add(nowe);
        nowe.setSkladowisko(this);

        if (x > kolumny)
        {
            kolumny = x;
        }
        if (y > rzedy)
        {
            rzedy = y;
        }
        //TODO
        //sprawdzenie czy takie pole juz przypadkiem nie istnieje
        return true;
    }
    //**************************************************************************

    public Pole getPole(int x, int y)
    {
        for (int i = 0; i < pola.size(); i++)
        {
            Pole tmp = pola.get(i);
            if (tmp.getX() == x && tmp.getY() == y)
            {
                return tmp;
            }
        }
        return null;
    }

    public Pole nextPole(int x, int y)
    {
        if (x > this.kolumny || y > this.rzedy || x < 1 || y < 1)
        {
            return null;
        }
        if (x == this.kolumny)
        {
            if (y == this.rzedy)
            {
                return null;
            }
            x = 1;
            return getPole(x, y + 1);
        }

        return getPole(x + 1, y);
    }
    //**************************************************************************

    public Pole getPole(String id)
    {
        for (int i = 0; i < pola.size(); i++)
        {
            Pole tmp = pola.get(i);
            if (tmp.getId().equals(id))
            {
                return tmp;
            }
        }
        return null;
    }
    //**************************************************************************

    public void setId(String id)
    {
        this.id = id;
    }

    public String getId()
    {
        return this.id;
    }
    //**************************************************************************

    public void skladuj(Kontener nowy, Lokalizacja lokalizacja) throws UnsupportedOperationException
    {
        Pole szukane = getPole(lokalizacja.X, lokalizacja.Y);
        if (szukane == null)
        {
            throw new IllegalArgumentException("Nie znaleziono danego pola!");
        }

        szukane.getZawartoscPola().polozObiekt(nowy, lokalizacja.W);
    }
    //**************************************************************************

    @Override
    public String toString()
    {
        return "Skladowisko: " + id;
    }
    //**************************************************************************

    public int getIloscPol()
    {
        return this.pola.size();
    }
    //**************************************************************************

    public int getRzedy()
    {
        return this.rzedy;
    }
    //**************************************************************************

    public int getKolumny()
    {
        return this.kolumny;
    }
    //**************************************************************************

    public DostepDoPola sprawdzDostep(Pole pole)
    {
        DostepDoPola dostep = new DostepDoPola(pole);

        int x = pole.getX();
        int y = pole.getY();

        if (y == 1 || y == this.getRzedy())
        {
            dostep.setSwobodnyDostep(true);
            dostep.setIleOperacji(0);
            dostep.dodajPoleDoPrzesuniecia(pole);
            return dostep;
        } else
        {
            dostep = obliczDostep(pole);
        }

        return dostep;
    }
    //**************************************************************************

    private DostepDoPola obliczDostep(Pole p)
    {
        DostepDoPola dostepGora = new DostepDoPola(p);
        DostepDoPola dostepDol = new DostepDoPola(p);

        for (int i = 1; i < p.getY(); i++)
        {
            Pole poleDoPrzestawienia = this.getPole(p.getX(), i);
            dostepGora.dodajOperacje(poleDoPrzestawienia.getZawartoscPola().getIloscKontenerow());
            dostepGora.dodajPoleDoPrzesuniecia(poleDoPrzestawienia);
        }

        for (int i = this.getRzedy(); i > p.getY(); i--)
        {
            Pole poleDoPrzestawienia = this.getPole(p.getX(), i);
            dostepDol.dodajOperacje(poleDoPrzestawienia.getZawartoscPola().getIloscKontenerow());
            dostepDol.dodajPoleDoPrzesuniecia(poleDoPrzestawienia);
        }

        if (dostepDol.getIleOperacji() > 0)
        {
            dostepDol.setSwobodnyDostep(false);
        }
        if (dostepGora.getIleOperacji() > 0)
        {
            dostepGora.setSwobodnyDostep(false);
        }

        if (dostepDol.getIleOperacji() > dostepGora.getIleOperacji())
        {
            return dostepGora;
        }
        return dostepDol;

    }
//**************************************************************************

    void zeruj()
    {
        for (Pole p : pola)
        {
            p.zeruj();
        }
    }
    //**************************************************************************

    public int ileWolnychMiejsc()
    {
        int wynik = 0;
        for (Pole p : pola)
        {
            wynik += p.getZawartoscPola().getLiczbaWarstwa() - p.getZawartoscPola().getPierwszaWolna()+1;
        }

        return wynik;
    }
    //**************************************************************************
}
